[ Rails guide study ] Day26 Rails Routing part2
首先,來聽首歌吧
Kimberly 的歌聲我一直都還滿喜歡的,覺得像這樣離鄉背井的歌手實在應該好好支持他!
今天繼續來探討 rails 的路徑寫法還有什麼眉角,看一看還真發現沒看過的寫法真多...
我們在使用 resource 表示路徑的時候,還可以做出巢狀的路徑
resources :magazines do
resources :ads
end
雖然很方便,但一般建議一次巢狀就夠了,幾乎沒有什麼需求會用到兩層巢狀結構
在巢狀結構下,有一種很常被使用:
resources :articles do
resources :comments, only: [:index, :new, :create]
end
resources :comments, only: [:show, :edit, :update, :destroy]
這個的意思是說,每一篇文章都有自己的 comment,在新增跟建立的時候需要知道是哪篇文章,但在檢視每一則 comment 還有編輯修改刪除的時候並不需要
因為太常用了,所以 Rails 賜它另一種好寫的方法
resources :articles do
resources :comments, shallow: true
end
變形的寫法還有很多種,但關鍵字就是 shallow ,有需要可以自己再來 Rails Guide 查
假如我們今天 user 跟 post 都同時需要巢狀路徑,而底下那層都是 image,我們需要把同樣的 code 寫兩次
resource :user do
resource :image
end
resources :posts do
resource :image
end
對於堅持 DRY 理念的攻城屍來說,同樣的東西寫兩次就是不舒服!
所以這樣的東西 Rails 也有提供另外的方法,上面的例子可以改寫如下:
concern :imageable do
resource :image
end
resource :user, concerns: :imageable
resources :posts, concerns: :imageable
在使用 rails 的時候,大家一定都知道可以使用 resources 自動幫你加的路徑名字,比方說 candidates controller 裡面的 new 方法的路徑叫做 new_candidate_path
,實際上我們可以用 as
的選項來修改
get 'exit', to: 'sessions#destroy', as: :logout
就像這樣,我們如果使用 logout_path
就可以連結到 /exit
這個 url 了!
如果我們在碰到想要讓很多動作同時指到同一個路徑的話,可以使用 via
這個選項
match 'photos', to: 'photos#show', via: [:get, :post]
這個例子中,只要你的路徑是 /photos
,不管動詞是 get 還是 post 都能到這個頁面
除此之外,還可以使用 all 表示全部的 action 都可以到這裡:
match 'photos', to: 'photos#show', via: :all
Rails 裡面路徑的介紹就先到這裡了~
參考資料:
本文章同步分享於 http://anthonychao.site/